home *** CD-ROM | disk | FTP | other *** search
/ Super PC 34 / Super PC 34 (Shareware).iso / spc / UTIL / DJGPP2 / V2 / DJTST200.ZIP / tests / libc / ansi / math / elefunt / ttanh.c < prev    next >
Encoding:
C/C++ Source or Header  |  1995-06-02  |  5.7 KB  |  232 lines

  1. /* -*-C-*- ttanh.c */
  2.  
  3. #include "elefunt.h"
  4.  
  5. /*
  6. #     program to test tanh
  7. #
  8. #     data required
  9. #
  10. #        none
  11. #
  12. #     subprograms required from this package
  13. #
  14. #        machar - an environmental inquiry program providing
  15. #                 information on the floating-point arithmetic
  16. #                 system.  note that the call to machar can
  17. #                 be deleted provided the following five
  18. #                 parameters are assigned the values indicated
  19. #
  20. #                 ibeta  - the radix of the floating-point system
  21. #                 it     - the number of base-ibeta digits in the
  22. #                          significand of a floating-point number
  23. #                 minexp - the largest in magnitude negative
  24. #                          integer such that float(ibeta)**minexp
  25. #                          is a positive floating-point number
  26. #                 xmin   - the smallest non-vanishing floating-point
  27. #                          power of the radix
  28. #                 xmax   - the largest finite floating-point no.
  29. #
  30. #        ran(k) - a function subprogram returning random real
  31. #                 numbers uniformly distributed over (0,1)
  32. #
  33. #
  34. #     standard fortran subprograms required
  35. #
  36. #         abs, alog, amax1, float, sqrt, tanh
  37. #
  38. #
  39. #     latest revision - december 6, 1979
  40. #
  41. #     author - w. j. cody
  42. #              argonne national laboratory
  43. #
  44. #*/
  45.  
  46. void
  47. ttanh()
  48. {
  49.  
  50.     int i,
  51.         ibeta,
  52.         iexp,
  53.         irnd,
  54.         it,
  55.         i1,
  56.         j,
  57.         k1,
  58.         k2,
  59.         k3,
  60.         machep,
  61.         maxexp,
  62.         minexp,
  63.         n,
  64.         negep,
  65.         ngrd;
  66.     float a,
  67.         ait,
  68.         albeta,
  69.         b,
  70.         beta,
  71.         betap,
  72.         c,
  73.         d,
  74.         del,
  75.         eps,
  76.         epsneg,
  77.         expon,
  78.         half,
  79.         r6,
  80.         r7,
  81.         w,
  82.         x,
  83.         xl,
  84.         xmax,
  85.         xmin,
  86.         xn,
  87.         x1,
  88.         y,
  89.         z,
  90.         zz;
  91.  
  92.     machar(&ibeta, &it, &irnd, &ngrd, &machep, &negep, &iexp, &minexp,
  93.         &maxexp, &eps, &epsneg, &xmin, &xmax);
  94.  
  95.     beta = (float) ibeta;
  96.     albeta = ALOG(beta);
  97.     ait = (float) it;
  98.     half = 0.5e0L;
  99.     a = 0.125e0L;
  100.     b = ALOG(3.0e0L) * half;
  101.     c = 1.2435300177159620805e-1L;
  102.     d = ALOG(2.0e0L) + (ait + ONE) * ALOG(beta) * half;
  103.     n = 2000;
  104.     xn = (float) n;
  105.     i1 = 0;
  106.  
  107.     /* random argument accuracy tests */
  108.  
  109.     for (j = 1; j <= 2; ++j)
  110.     {
  111.     k1 = 0;
  112.     k3 = 0;
  113.     x1 = ZERO;
  114.     r6 = ZERO;
  115.     r7 = ZERO;
  116.     del = (b - a) / xn;
  117.     xl = a;
  118.  
  119.     for (i = 1; i <= n; ++i)
  120.     {
  121.         x = del * ran(i1) + xl;
  122.         z = tanh(x);
  123.         y = x - 0.125e0L;
  124.         zz = tanh(y);
  125.         zz = (zz + c) / (ONE + c * zz);
  126.         w = ONE;
  127.         if (z != ZERO)
  128.         w = (z - zz) / z;
  129.         if (w > ZERO)
  130.         k1 = k1 + 1;
  131.         if (w < ZERO)
  132.         k3 = k3 + 1;
  133.         w = ABS(w);
  134.         if (w > r6)
  135.         {
  136.         r6 = w;
  137.         x1 = x;
  138.         }
  139.         r7 = r7 + w * w;
  140.         xl = xl + del;
  141.     }
  142.  
  143.     k2 = n - k3 - k1;
  144.     r7 = sqrt(r7 / xn);
  145.     printf(
  146. "\fTEST OF TANH(X) VS (TANH(X-1/8)+TANH(1/8))/(1+TANH(X-1/8)TANH(1/8))\n\n");
  147.     printf("%7d RANDOM ARGUMENTS WERE TESTED FROM THE INTERVAL\n", n);
  148.     printf("      (" F15P4E "," F15P4E ")\n\n\n", a, b);
  149.     printf(" TANH(X) WAS LARGER%6d TIMES,\n", k1);
  150.     printf("             AGREED%6d TIMES, AND\n", k2);
  151.     printf("        WAS SMALLER%6d TIMES.\n\n", k3);
  152.     printf(
  153. " THERE ARE%4d BASE%4d SIGNIFICANT DIGITS IN A FLOATING-POINT NUMBER\n\n",
  154.         it, ibeta);
  155.     w = -999.0e0;
  156.     if (r6 != ZERO)
  157.         w = ALOG(ABS(r6)) / albeta;
  158.     printf(" THE MAXIMUM RELATIVE ERROR OF" F15P4E " = %4d **" F7P2F "\n",
  159.         r6, ibeta, w);
  160.     printf("    OCCURRED FOR X =" F17P6E "\n", x1);
  161.     w = AMAX1(ait + w, ZERO);
  162.     printf(
  163.         " THE ESTIMATED LOSS OF BASE%4d SIGNIFICANT DIGITS IS" F7P2F "\n\n\n",
  164.         ibeta, w);
  165.     w = -999.0e0;
  166.     if (r7 != ZERO)
  167.         w = ALOG(ABS(r7)) / albeta;
  168.     printf(" THE ROOT MEAN SQUARE RELATIVE ERROR WAS" F15P4E " = %4d **" F7P2F "\n",
  169.         r7, ibeta, w);
  170.     w = AMAX1(ait + w, ZERO);
  171.     printf(
  172.         " THE ESTIMATED LOSS OF BASE%4d SIGNIFICANT DIGITS IS" F7P2F "\n\n\n",
  173.         ibeta, w);
  174.     a = b + a;
  175.     b = d;
  176.     }
  177.  
  178.     /* special tests */
  179.  
  180.     printf("\fSPECIAL TESTS\n\n");
  181.     printf(" THE IDENTITY   TANH(-X) = -TANH(X)   WILL BE TESTED.\n\n\n");
  182.     printf("        X         F(X) + F(-X)\n\n");
  183.  
  184.     for (i = 1; i <= 5; ++i)
  185.     {
  186.     x = ran(i1);
  187.     z = tanh(x) + tanh(-x);
  188.     printf(F15P7E F15P7E "\n\n", x, z);
  189.     }
  190.  
  191.     printf(" THE IDENTITY TANH(X) = X , X SMALL, WILL BE TESTED.\n\n\n");
  192.     printf("        X         X - F(X)\n\n");
  193.     betap = ipow(beta, it);
  194.     x = ran(i1) / betap;
  195.  
  196.     for (i = 1; i <= 5; ++i)
  197.     {
  198.     z = x - tanh(x);
  199.     printf(F15P7E F15P7E "\n\n", x, z);
  200.     x = x / beta;
  201.     }
  202.  
  203.     printf(" THE IDENTITY TANH(X) = 1 , X LARGE, WILL BE TESTED.\n\n\n");
  204.     printf("        X         1 - F(X)\n\n");
  205.     x = d;
  206.     b = 4.0e0L;
  207.  
  208.     for (i = 1; i <= 5; ++i)
  209.     {
  210.     z = (tanh(x) - half) - half;
  211.     printf(F15P7E F15P7E "\n\n", x, z);
  212.     x = x + b;
  213.     }
  214.  
  215.     printf(" TEST OF UNDERFLOW FOR VERY SMALL ARGUMENT.\n\n");
  216.     expon = (float) minexp *0.75e0L;
  217.     x = pow(beta, expon);
  218.     z = tanh(x);
  219.     printf("       TANH(" F13P6E ") =" F13P6E "\n", x, z);
  220.     printf(" THE FUNCTION TANH WILL BE CALLED WITH THE ARGUMENT" F15P7E "\n", xmax);
  221.     z = tanh(xmax);
  222.     printf("       TANH(" F13P6E ") =" F13P6E "\n", xmax, z);
  223.     printf(" THE FUNCTION TANH WILL BE CALLED WITH THE ARGUMENT" F15P7E "\n", xmin);
  224.     z = tanh(xmin);
  225.     printf("       TANH(" F13P6E ") =" F13P6E "\n", xmin, z);
  226.     x = ZERO;
  227.     printf(" THE FUNCTION TANH WILL BE CALLED WITH THE ARGUMENT" F15P7E "\n", x);
  228.     z = tanh(x);
  229.     printf("       TANH(" F13P6E ") =" F13P6E "\n", x, z);
  230.     printf(" THIS CONCLUDES THE TESTS\n");
  231. }
  232.